<?php

namespace App\Models;

use App\Service\Base\Model;
use Illuminate\Support\Str;

class User extends Model
{
    // 用户管理
    protected $table = 'user';

    // 缓存字段，用于搜索绑定的字段
    protected $cacheFields = ["id", "status",];


    // 获取多条数据（参数只有ids，因为使用in没办法缓存，所以这么操作）
    public function getOneById($id, $fields = ['*'], $pk = 'id')
    {
        if(empty($id)){
            return [];
        }
        // 如果不要缓存 直接查询
        $getOneById = true;
        $is_cache   = $this->is_cache;
        if(empty($is_cache)){
            $info = $this->select($fields)->where($pk, $id)->first();
            $info = is_object($info) ? $info->toArray() : $info;
        } else{
            // 如果缓存 则查询缓存
            $args  = compact('id', 'fields', 'pk', 'getOneById');
            $cName = $this->cacheKey('show', $args);
            $info  = $this->cacheClass()->getCache($cName);
            if(empty($info)){
                // 查询
                $info = $this->where($pk, $id)->select($fields)->first();
                $info = is_object($info) ? $info->toArray() : $info;
                $this->addCacheShow($info, $cName, $info);
            }
        }

        // 各种查询后的操作

        // 1、头像
        // 2、认证类型


        return $info;
    }

    // 检查唯一性
    public function checkUser($data, $id = '')
    {

        $where = [];
        // username 唯一性
        if(!empty($data['username'])){
            $yzwhere = [['username', '=', $data['username']], ['status', '>=', 0]];
            if($id){
                $where = [['id', '<>', $id]];
            }
            $info = $this->where($where)->where($yzwhere)->first();
            if($info){
                return $this->return_false('该用户名已经存在！');
            }
        }


        // email 唯一性
        if(!empty($data['email'])){
            $yzwhere = [['email', '=', $data['email']], ['status', '>=', 0]];
            if($id){
                $where = [['id', '<>', $id]];
            }
            $info = $this->where($where)->where($yzwhere)->first();
            if($info){
                return $this->return_false('该邮箱已经存在！');
            }
        }

        // mobile 唯一性
        if(!empty($data['mobile'])){
            $yzwhere = [['mobile', '=', $data['mobile']], ['status', '>=', 0]];
            if($id){
                $where = [['id', '<>', $id]];
            }
            $info = $this->where($where)->where($yzwhere)->first();
            if($info){
                return $this->return_false('该手机号已经存在！');
            }
        }

        return $data;
    }

    // 添加验证
    public function checkData($data, $where = [])
    {
        // 随机码
        if($where && empty($data['password'])){
            unset($data['password']);
        } else{
            $salt = Str::random(4);
            if(empty($data['password'])){
                $data['password'] = 123456;
            }
            // 密码
            $data['salt']     = $salt;
            $data['password'] = $this->add_md5($data['password'], $salt);
        }

        // 整理角色
        if(empty($data['role'])){
            unset($data['role']);
        } else{
            $data['role'] = json_encode($data['role'], 1);
        }

        return $data;
    }

    // 登录
    public function login($username, $password, $loginField = 'username')
    {
        // 获取用户信息
        $info = $this->where([$loginField => $username])->first();
        if(empty($info)){
            return $this->return_false('用户不存在！！');
        }
        if($info->status === 0){
            return $this->return_false('用户被禁止登录！！');
        }

        // 验证密码
        if(!$this->ckeckPassword($password, $info->salt, $info['password'])){
            return $this->return_false('密码错误！！');
        }

        // 登录成功
        $user   = ['id' => $info->id, 'username' => $info->username, 'head_img' => $info->head_img, 'mobile' => $info->mobile];
        $updata = ['last_ip' => request()->ip(), 'last_time' => time(),];
        $rst    = $this->where('id', $info->id)->update($updata);

        return $user;
    }

    // 加密密码
    public function add_md5($password, $salt = '')
    {
        return password_hash($password.$salt, PASSWORD_DEFAULT);
    }

    // 解密
    public function ckeckPassword($password, $salt, $hash)
    {
        return password_verify($password.$salt, $hash);
    }


    // 定义验证操作
    public function rules()
    {
        $add = [
            'username' => 'required',
            'password' => 'required',
            'salt'     => 'required',
        ];

        $edit = [
        ];

        $info = [
            //'username'  => 'required',
            //'realname' => 'required',
        ];


        $rule = [
            //'id' => 'numeric',
            'username' => 'required',
            'password' => 'required',
            'salt'     => 'required',
            //'nickname'  => 'required',
            //'head_img'  => 'required',
            //'mobile'    => 'required',
            //'email'     => 'required',
            //'sex'       => 'required',
            //'openid'    => 'required',
            //'reg_ip'    => 'required',
            //'last_ip'   => 'required',
            //'last_time' => 'required',
            //'sign'      => 'required',
            //'from_uid'  => 'required',
            'status'   => ['in:0,1,2'],
        ];


        $msg = [
            'id'        => '编号',
            'username'  => '用户名（唯一且不变，用于阿特@操作）',
            'password'  => '密码',
            'salt'      => '随机字符串',
            'nickname'  => '昵称（企业认证名称，因为程序中已经使用，所以不修改字段名）',
            'head_img'  => '头像',
            'mobile'    => '手机号',
            'email'     => '邮箱',
            'sex'       => '0-保密1-男 2-女',
            'openid'    => '微信openid',
            'reg_ip'    => '注册ip',
            'last_ip'   => '上次登录ip',
            'last_time' => '上次登录时间',
            'sign'      => '个性签名',
            'status'    => '状态 0-禁用 1-正常 -1-删除',
            'from_uid'  => '邀请人',
            'ctime'     => '创建时间',
            'mtime'     => '修改时间',
        ];

        return ['rule' => $rule, 'msg' => $msg, 'add' => $add, 'info' => $info];
    }

}
